﻿@using DatabaseLibrary;
@using Microsoft.VisualBasic;

@* Quitar esta sección si se utilizan agrupaciones *@
@section Scripts {
    <script src="~/Scripts/jquery.validate.min.js"></script>
    <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            var myDate = new Date(2000, 01, 01);
            $("#fechaNacimiento").datepicker({ dateFormat: 'yy-mm-dd' });
            $('#fechaNacimiento').datepicker('setDate', myDate);
        });
    </script>
}
@{
    Layout = "~/_SiteLayout.cshtml";
    Page.Title = "Formulario para registro de usuarios.";

    // Inicializar variables de página generales
    var email = string.Empty;
    var password = string.Empty;
    var confirmPassword = string.Empty;
    var identificacion = string.Empty;
    var nombres = string.Empty;
    var apellidos = string.Empty;
    var Cbo_genero = string.Empty;
    var fechaNacimiento = string.Empty;
    DateTime fNac = DateTime.MinValue;
    var Cbo_empresa = string.Empty;
    var Cbo_tDoc = string.Empty;

    WebImage photo = null;
    var newFileName = string.Empty;
    var imagePath = string.Empty;

    Validation.Add("identificacion", Validator.StringLength(maxLength: 15, errorMessage: "El texto supera el maximo permitido de 15 caracteres."));
    Validation.Add("nombres", Validator.StringLength(maxLength: 100, errorMessage: "El texto supera el maximo permitido de 100 caracteres."));
    Validation.Add("apellidos", Validator.StringLength(maxLength: 100, errorMessage: "El texto supera el maximo permitido de 100 caracteres."));

    // Validación de la instalación   
    Validation.RequireField("email", "Debe especificar una dirección de correo electrónico.");
    Validation.RequireField("password", "La contraseña no puede estar en blanco.");
    Validation.Add("confirmPassword",
        Validator.EqualsTo("password", "La nueva contraseña y la contraseña de confirmación no coinciden."));
    Validation.Add("password",
        Validator.StringLength(
            maxLength: Int32.MaxValue,
            minLength: 6,
            errorMessage: "La contraseña debe tener al menos seis caracteres"));

    Validation.Add("foto",
    Validator.Regex(@"^.*\.(jpg|png)$", "Tipo de archivo invalido. Extensiones permitidas jpg y png")
    );

    Validation.Add("email",
    Validator.Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$", "Campo email incorrecto, por favor verifiquelo.")
    );

    Validation.Add("identificacion",
        Validator.Integer("Este campo debe contener solo numeros."));

    // Si esta es una solicitud  POST , valide y procese los datos
    if (IsPost)
    {
        AntiForgery.Validate();
        email = Request.Form["email"];
        password = Request.Form["password"];
        confirmPassword = Request.Form["confirmPassword"];

        Cbo_tDoc = Request.Form["Cbo_tDoc"];
        identificacion = Request.Form["identificacion"];
        nombres = Request.Form["nombres"];
        apellidos = Request.Form["apellidos"];
        Cbo_genero = Request.Form["Cbo_genero"];
        Cbo_empresa = Request.Form["Cbo_empresa"];
        fechaNacimiento = Request.Form["fechaNacimiento"];

        // Validar la respuesta captcha del usuario
        if (!ReCaptcha.Validate("6LfuauoSAAAAAPIcIebzh6oMnFcBf4Vr42oih8Th"))
        {
            ModelState.AddError("recaptcha", "La respuesta captcha no es correcta");
            ModelState.AddFormError("La respuesta captcha no es correcta");
        }

        if (Cbo_tDoc.IsEmpty() || Cbo_tDoc.Equals("0"))
        {
            ModelState.AddError("Cbo_tDoc", "Debe seleccionar un tipo documento.");
            ModelState.AddFormError("Debe seleccionar un tipo documento.");
        }

        if (identificacion.IsEmpty() && !Information.IsNumeric(identificacion))
        {
            ModelState.AddError("identificacion", "El campo identificacion no debe estar vacio.");
            ModelState.AddFormError("El campo identificacion no debe estar vacio.");
        }

        if (nombres.IsEmpty())
        {
            ModelState.AddError("nombres", "El campo nombre no debe estar vacio.");
            ModelState.AddFormError("El campo nombre no debe estar vacio.");
        }
        if (apellidos.IsEmpty())
        {
            ModelState.AddError("apellidos", "El campo apellido no debe estar vacio.");
            ModelState.AddFormError("El campo apellido no debe estar vacio.");
        }

        if (Cbo_genero.IsEmpty() || Cbo_genero.Equals("0"))
        {
            ModelState.AddError("Cbo_genero", "Debe seleccionar un genero.");
            ModelState.AddFormError("Debe seleccionar un genero.");
        }

        if (Cbo_empresa.IsEmpty() || Cbo_genero.Equals("0"))
        {
            ModelState.AddError("Cbo_empresa", "Debe seleccionar una empresa.");
            ModelState.AddFormError("Debe seleccionar una empresa.");
        }

        if (fechaNacimiento.IsEmpty())
        {
            ModelState.AddError("fechaNacimiento", "El campo fechaNacimiento no debe estar vacio.");
            ModelState.AddFormError("El campo fechaNacimiento no debe estar vacio.");
        }
        else
        {
            DateTime dateValue;
            if (DateTime.TryParse(fechaNacimiento, out dateValue))
            {
                fNac = DateTime.Parse(fechaNacimiento);

                if (fNac >= DateTime.Now)
                {
                    ModelState.AddError("fechaNacimiento", "Por favor revise la fecha de nacimiento.");
                    ModelState.AddFormError("Por favor revise la fecha de nacimiento.");
                }
            }
            else
            {
                ModelState.AddError("fechaNacimiento", "Por favor revise la fecha de nacimiento.");
                ModelState.AddFormError("Por favor revise la fecha de nacimiento.");
            }
        }


        // Si toda la información es válida, crear una nueva cuenta
        if (Validation.IsValid())
        {
            // Insertar un nuevo usuario en la base de datos
            var db = Database.Open("web_vote");

            // Comprobar si el usuario ya existe
            var user = db.QuerySingle("SELECT Email FROM UserProfile WHERE LOWER(Email) = LOWER(@0)", email);
            if (user == null)
            {
                // Insertar correo electrónico en la tabla de perfiles
                db.Execute("INSERT INTO UserProfile (Email) VALUES (@0)", email);

                var idUsuario = db.GetLastInsertId();

                // Cree y asocie una nueva entrada en la base de datos de miembros.
                // Si la operación se realiza correctamente, siga procesando la solicitud
                try
                {
                    // se agrega la cuenta en membership
                    bool requireEmailConfirmation = false; //!WebMail.SmtpServer.IsEmpty();
                    var token = WebSecurity.CreateAccount(email, password, requireEmailConfirmation);

                    WebMail.Send(
                        to: email,
                        subject: "Bienvenido a web-vote.",
                        body: "Su registro a sido exitoso, le recordamos que para poder acceder a web-vote debe ingresar con los siguientes datos: <br/> " + "Usuario :" + email + " <br/> Contraseña: " + password + " <br/> "
                    );

                    // se agrega un usuario al rol                        
                    Roles.AddUserToRole(email.ToString(), "User");

                    // guardamos la imagen
                    photo = WebImage.GetImageFromRequest();
                    if (photo != null)
                    {
                        newFileName = identificacion;
                        imagePath = @"imagenes\" + newFileName + "." + photo.ImageFormat;

                        photo.Resize(300, 253);
                        photo.Save(@"~\" + imagePath);
                    }

                    // inserta en la tabla usuario
                    db.Execute("INSERT INTO Usuario (id_usuario, identificacion, nombres, apellidos, genero, fecha_nacimiento, ruta_imagen, id_Empresa, id_tipo_documento)" +
                                "VALUES (@0, @1, @2, @3, @4, @5, @6, @7, @8)", idUsuario, identificacion, nombres, apellidos, Cbo_genero, fechaNacimiento, imagePath, Cbo_empresa, Cbo_tDoc, email);

                    if (requireEmailConfirmation)
                    {
                        // Agradecer al usuario que se haya registrado e informarle de que recibirá un correo
                        Response.Redirect("~/Account/Thanks");
                    }
                    else
                    {
                        // Intentar iniciar sesión mediante las credenciales suministradas
                        //se cambia para la funcionalidad de sql server. Se cargan las variables (id_usuario-id_rol-id_empresa)
                        Login Obj_login = new Login();
                        Obj_login.Objlogin.Email_vo = email;
                        Obj_login.Objlogin.Contraseña_vo = password;
                        Obj_login.Objlogin.Tipotran_vo = 1;

                        var mylista = Obj_login.consultar(1);

                        // Intentar iniciar sesión mediante las credenciales suministradas
                        if (WebSecurity.Login(email, password))
                        {
                            if (mylista.Count > 0)
                            {
                                Session["id_usuario"] = mylista[0].id_Usuario_vo;
                                Session["id_rol"] = mylista[0].RoleId_vo;
                                Session["id_empresa"] = mylista[0].id_Empresa_vo;
                                Session["nombre"] = mylista[0].nombre_vo;

                                Response.Redirect("~/");
                            }
                        }
                    }
                }
                catch (System.Web.Security.MembershipCreateUserException e)
                {
                    ModelState.AddFormError(e.Message);
                }
            }
            else
            {
                // El usuario ya existe
                ModelState.AddFormError("El correo ya se encuentra en uso.");
            }
        }
        else
        {
            ModelState.AddError("errorGeneral", "Hay errores por favor verifique todos los campos.");
        }
    }
}
<hgroup class="title">
    <h1>@Page.Title</h1>
</hgroup>
<br />
<form method="post" enctype="multipart/form-data">
    @AntiForgery.GetHtml()
    @* Si existe al menos un error de validación, informar al usuario *@
    @Html.ValidationSummary("No se creó la cuenta. Corrija los errores e inténtelo de nuevo.", excludeFieldErrors: true, htmlAttributes: null)
    <fieldset>
        <legend>Formulario de registro</legend>
        <h3>Datos personales</h3>
        <hr />
        <ol>
            <li class="email">
                <label for="Cbo_tDoc" @if (!ModelState.IsValidField("Cbo_tDoc"))
                                      {<text>class="error-label"</text>}>
                    Tipo documento
                </label>
                <select id="Cbo_tDoc" name="Cbo_tDoc" @Validation.For("Cbo_tDoc")>
                    <option value="0" selected="selected">Seleccione</option>
                    @{ 
                        ServicioGenerico<tipo_documento> servicioListarTDoc = new ServicioGenerico<tipo_documento>();

                        List<tipo_documento> lstTDoc = new List<tipo_documento>();
                        lstTDoc = servicioListarTDoc.listar();

                        foreach (var elementTDoc in lstTDoc)
                        {
                        @:<option value="@elementTDoc.id_tipo_documento"> @elementTDoc.nombre </option>
                                    }
                    }
                </select>
                @Html.ValidationMessage("Cbo_tDoc")
            </li>
            <li class="email">
                <label for="identificacion" @if (!ModelState.IsValidField("identificacion"))
                                            {<text>class="error-label"</text>}>
                    Identificacion</label>
                <input type="text" id="identificacion" name="identificacion" maxlength="15" value="@identificacion" @Validation.For("identificacion") />
                @* Escribir los errores de validación del correo electrónico en la página *@
                @Html.ValidationMessage("identificacion")
            </li>
            <li class="email">
                <label for="nombres" @if (!ModelState.IsValidField("nombres"))
                                     {<text>class="error-label"</text>}>
                    Nombres
                </label>
                <input type="text" id="nombres" name="nombres" value="@nombres" maxlength="100" @Validation.For("nombres") />
                @* Escribir los errores de validación del correo electrónico en la página *@
                @Html.ValidationMessage("nombres")
            </li>
            <li class="email">
                <label for="apellidos" @if (!ModelState.IsValidField("apellidos"))
                                       {<text>class="error-label"</text>}>
                    Apellidos
                </label>
                <input type="text" id="apellidos" name="apellidos" maxlength="100" value="@apellidos" @Validation.For("apellidos") />
                @* Escribir los errores de validación del correo electrónico en la página *@
                @Html.ValidationMessage("apellidos")
            </li>
            <li class="email">
                <label for="Cbo_genero" @if (!ModelState.IsValidField("Cbo_genero"))
                                        {<text>class="error-label"</text>}>
                    Genero
                </label>
                <select id="Cbo_genero" name="Cbo_genero" @Validation.For("Cbo_genero")>
                    <option value="0" selected="selected">Seleccione</option>
                    <option value="M">Masculino</option>
                    <option value="F">Femenino</option>
                </select>
                @Html.ValidationMessage("Cbo_genero")
            </li>
            <li class="email">
                <label for="Cbo_empresa" @if (!ModelState.IsValidField("Cbo_empresa"))
                                         {<text>class="error-label"</text>}>
                    Empresa
                </label>
                <select id="Cbo_empresa" name="Cbo_empresa" @Validation.For("Cbo_empresa")>
                    <option value="0" selected="selected">Seleccione</option>
                    @{ 
                        ServicioGenerico<empresa> servicioListarEmpresa = new ServicioGenerico<empresa>();
                        servicioListarEmpresa.entidad.estado = true;

                        List<empresa> lstEmpresa = new List<empresa>();
                        lstEmpresa = servicioListarEmpresa.listar();

                        foreach (var elementEmpresa in lstEmpresa)
                        {
                        @:<option value="@elementEmpresa.id_empresa"> @elementEmpresa.nombre </option>
                                    }
                    }
                </select>
                @Html.ValidationMessage("Cbo_empresa")
            </li>
            <li class="email">
                <label for="fechaNacimiento" @if (!ModelState.IsValidField("fechaNacimiento"))
                                             {<text>class="error-label"</text>}>
                    Fecha nacimiento
                </label>
                <input type="text" name="fechaNacimiento" id="fechaNacimiento" value="@fechaNacimiento" readonly="true"
                                        size="12" @Validation.For("fechaNacimiento") />
                @* Escribir los errores de validación del correo electrónico en la página *@
                @Html.ValidationMessage("fechaNacimiento")
            </li>
            <li class="email">
                <label for="foto" @if (!ModelState.IsValidField("foto"))
                                  {<text>class="error-label"</text>}>
                    Foto
                </label>
                <input type="file" id="foto" name="foto" @Validation.For("email") />
            </li>
            <li class="email">
                <br />
                <h3>Datos de ingreso al sistema</h3>
                <hr />
                <label for="email" @if (!ModelState.IsValidField("email"))
                                   {<text>class="error-label"</text>}>
                    Dirección de correo electrónico</label>
                <input type="text" id="email" name="email" maxlength="100" value="@email" @Validation.For("email") />
                @* Escribir los errores de validación del correo electrónico en la página *@
                @Html.ValidationMessage("email")
            </li>
            <li class="email">
                <label for="password" @if (!ModelState.IsValidField("password"))
                                      {<text>class="error-label"</text>}>
                    Contraseña</label>
                <input type="password" id="password" name="password" @Validation.For("password") />
                @* Escribir los errores de validación de contraseña en la página *@
                @Html.ValidationMessage("password")
            </li>
            <li class="email">
                <label for="confirmPassword" @if (!ModelState.IsValidField("confirmPassword"))
                                             {<text>class="error-label"</text>}>
                    Confirmar contraseña</label>
                <input type="password" id="confirmPassword" name="confirmPassword" @Validation.For("confirmPassword") />
                @* Escribir los errores de validación de contraseña en la página *@
                @Html.ValidationMessage("confirmPassword")
            </li>
        </ol>        
        <br />
        @ReCaptcha.GetHtml("6LfuauoSAAAAAKJGjumAo1eGgOoRTD9TBsM1ccTs", theme: "white")
        @Html.ValidationMessage("recaptcha")
        <br /><br />
        @Html.ValidationMessage("errorGeneral")
        <br />
        <br />
        <input type="submit" value="Registrarse" />
    </fieldset>
</form>
